module hip.api.math.forces; version(HipMathAPI): version(none): struct Forces { @disable this(); @nogc @safe nothrow { public static Vector2 dragForce(in Vector2 vel, float howMuch){return -vel.unit * howMuch * vel.magSquare;} public static Vector3 dragForce(in Vector3 vel, float howMuch){return -vel.unit * howMuch * vel.magSquare;} public static Vector2 frictionForce(in Vector2 vel, float howMuch){return howMuch * -vel.unit;} public static Vector3 frictionForce(in Vector3 vel, float howMuch){return howMuch * -vel.unit;} public static Vector2 gravitationalForce(in Vector2 posA, in Vector2 posB, float massA, float massB, float howMuch) { Vector2 vecDistance = (posB - posA); Vector2 dir = vecDistance.unit; return howMuch * ((massA * massB) / vecDistance.magSquare) * dir; } public static Vector3 gravitationalForce(in Vector3 posA, in Vector3 posB, float massA, float massB, float howMuch) { Vector3 vecDistance = (posB - posA); Vector3 dir = vecDistance.unit; return howMuch * ((massA * massB) / vecDistance.magSquare) * dir; } public static Vector2 springForce(in Vector2 anchor, in Vector2 displacement, float springLength, float howMuch) { Vector2 movement = (displacement - anchor); float displacementForce = movement.mag - springLength; //-k * deltaL return (displacementForce * -howMuch) * movement.unit; } public static Vector3 springForce(in Vector3 anchor, in Vector3 displacement, float springLength, float howMuch) { Vector3 movement = (displacement - anchor); float displacementForce = movement.mag - springLength; movement.normalize; //-k * deltaL return (displacementForce * -howMuch) * movement; } } }